package com.neuedu.corejava.ch13;

import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * 没有线程同步的示例：可能有多个线程对同一资源进行访问，可能造成数据共享安全 使用了线程同步，解决了线程共享的问题，每个线程访问到的数据都是自己操作后的数据
 * 代码块锁只锁定特定的代码块，方法锁是控制整个对象的，会对所有线程起作用；
 * @author admin
 *
 */
public class ThreadSy3 {
	private static final Object LOCKED = new Object();//只要是Object类或其它子类都可以作为一把锁
	private static final Object LOCKED2 = new Object();//注意：在程序中可能多把锁，需要对同一个资源进行锁定（同步），必须使用同一把锁
	private int i = 10;

	public void inc(int id) {
		//代码块锁，可以使用一个对象锁定一个代码块，在代码块中控制对某个资源的共享
		//如何加锁：对有线程共享安全的数据进行加锁，使用方法锁或代码块锁
		synchronized (LOCKED) {
			i++;
			System.out.println(id + "," + i);
		}
	}

	public void dec(int id) {
		synchronized (LOCKED2) {
			i--;
			System.out.println(id + "," + i);
		}
	}

	class Inc implements Runnable {
		private int id = 0;

		public Inc(int id) {
			this.id = id;
		}

		@Override
		public void run() {
			for (int j = 0; j < 30; j++) {
				inc(id);
			}
		}
	}

	class Dec implements Runnable {

		private int id = 0;

		public Dec(int id) {
			this.id = id;
		}

		@Override
		public void run() {
			for (int j = 0; j < 30; j++) {
				dec(id);
			}
		}
	}

	public static void main(String[] args) {
		ThreadSy3 tSy = new ThreadSy3();
		Inc inc = tSy.new Inc(1);
		Dec dec = tSy.new Dec(3);
		Inc inc2 = tSy.new Inc(2);
		Dec dec2 = tSy.new Dec(4);

		Thread thread = new Thread(inc);
		thread.start();
		thread = new Thread(dec);
		thread.start();
		new Thread(inc2).start();
		new Thread(dec2).start();

	}
}
